package com.itcam.cm.common.exception;


import com.itcam.cm.model.vo.common.Result;
import com.itcam.cm.model.vo.common.ResultCodeEnum;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理类，使用 @RestControllerAdvice 注解，用于捕获并处理全局范围内的异常。
 * 该类会拦截所有控制器中抛出的异常，并统一进行处理，返回统一的结果对象。
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 处理所有类型的异常。
     * 当应用中抛出 Exception 及其子类的异常时，会进入此方法进行处理。
     *
     * @param e 捕获到的异常对象
     * @return 返回一个封装了失败信息的 Result 对象，包含异常的消息
     */
    @ExceptionHandler(Exception.class)
    public Result exceptionHandler(Exception e) {
        // 打印异常堆栈信息，建议在生产环境替换为更健壮的日志记录方式
        e.printStackTrace();
        // 返回一个封装了失败信息的 Result 对象，使用异常的消息作为失败原因
        return Result.fail(e.getMessage());
    }

    /**
     * 处理 IllegalArgumentException 类型的异常。
     * 当应用中抛出 IllegalArgumentException 异常时，会进入此方法进行处理。
     *
     * @param e 捕获到的 IllegalArgumentException 异常对象
     * @return 返回一个封装了失败信息的 Result 对象，包含异常的消息
     */
    @ExceptionHandler(IllegalArgumentException.class)
    public Result illegalArgumentException(IllegalArgumentException e) {
        // 打印异常堆栈信息，建议在生产环境替换为更健壮的日志记录方式
        e.printStackTrace();
        // 返回一个封装了失败信息的 Result 对象，使用异常的消息作为失败原因
        return Result.fail(e.getMessage());
    }

    /**
     * 处理自定义异常
     * @param exception
     * @return
     */
    public Result ItcamExceptionHandler(ItcamException exception) {
        exception.printStackTrace();
        return Result.build(null, exception.getResultCodeEnum());
    }

    /**
     * 处理系统异常
     * @param exception
     * @return
     */
    public Result systemExceptionHandler(Exception exception) {
        exception.printStackTrace();
        return Result.build(null, ResultCodeEnum.SYSTEM_ERROR);
    }

}

